package cn.com.ccxe.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.ccxe.core.entity.Keyword;
import cn.com.ccxe.core.entity.MonitorType;
import cn.com.ccxe.dao.KeywordDao;
import cn.com.ccxe.dao.OperationStatus;
import cn.com.ccxe.dao.impl.KeywordDaoImpl;

public class KeywordBussiness {

	private Logger logger = LoggerFactory.getLogger(KeywordBussiness.class);
	private KeywordDao dao = new KeywordDaoImpl();
	/**
	 * 获取该{@link MonitorType}下的所有关键字。
	 * @param monitorTypeId
	 * @return
	 */
	public List<Keyword> getAllKeywordInType(int monitorTypeId) {
		if(monitorTypeId > 0 ) {
			return dao.getAllKeywordInType(monitorTypeId);
		}
		return null;
	}
	
	public List<Keyword> getAllKeyword() {
		List<Keyword> list = dao.getAllKeyword();
		if(list != null && list.size() > 0) {
			return list;
		}
		return null;
	}

	/**
	 * 删除关键字，但关键字必须没有任何引用，才可执行删除操作。
	 * 如有引用，就返回{@link OperationStatus#RELATIONSHIP_EMPTY}
	 * @param keywordId
	 * @return
	 */
	public OperationStatus del(int keywordId) {
		if(keywordId <= 0) {
			throw new RuntimeException("keywordId="+keywordId+",无法删除！");
		}
		if(dao.count(keywordId) >0 )  {
			return OperationStatus.RELATIONSHIP_EMPTY;
		}
		return dao.del(keywordId);
	}
	
	/**
	 *  <b>添加关键字</b><br>
	 *  该方法支持两种添加方式，它们的判断依据是{@link Keyword#getMonitorTypes()}是否为空。
	 *  <ol>
	 *  	<li>为空形式:<br>
	 *  		因为没有设定类别，仅仅添加关键字的内容（内容必须填写）。</li>
	 *  	<li>非空形式：<br>
	 *  		因为有设定类别，那么就先添加关键字，再循环的附加上与类别的关系。
	 *  	</li>
	 *  </ol>
	 * @param keyword
	 * @return
	 */
	public OperationStatus add(Keyword keyword) {
		if(keyword == null) {
			throw new NullPointerException("没有找到关键字！");
		}
		dao.add(keyword);
		//判断是否为其添加关联关系。
		if(!(keyword.getMonitorTypes() == null 
				|| keyword.getMonitorTypes().size() == 0)) {
			
			addRelationship(keyword.getId(),keyword.getMonitorTypes());
		}
		return OperationStatus.SUCCESS;
	}
	
	/**
	 * 为一个{@link Keyword}关联多个{@link MonitorType}。
	 * @param keywordId 
	 * @param monitorTypes
	 */
	public int addRelationship(int keywordId, List<MonitorType> monitorTypes) {
		int count = 0;
		for (MonitorType monitorType : monitorTypes) {
			OperationStatus status = addRelationship(keywordId,monitorType.getId());
			//处理每条添加语句的执行状态，如果没有执行成功，就抛出RuntimeException
			switch (status) {
			case SUCCESS: count++;
				break;
			default:
				throw new RuntimeException("添加关系"+monitorType.getType()+"失败。");
			}
		}
		return count;
	}

	/**
	 * 为一个{@link Keyword}关联一个{@link MonitorType}。
	 * @param keywordId
	 * @param monitorTypeId
	 * @return
	 */
	public OperationStatus addRelationship(int keywordId, int monitorTypeId) {
		logger.info("keywordId:"+keywordId +",monitorTypeId:"+monitorTypeId);
		if(!(keywordId > 0 && monitorTypeId > 0)) {
			throw new NullPointerException("参数为空！");
		}
		return dao.addRelationshipForMonitorType(keywordId, monitorTypeId);
	}

	public OperationStatus delRelationStatus(int keywordId, int monitorTypeId) {
		if(!(keywordId > 0 && monitorTypeId > 0)) {
			throw new NullPointerException("参数为空！");
		}
		return dao.delRelationshipForMonitorType(keywordId, monitorTypeId);
	}

	public OperationStatus update(Keyword keyword) {
		if (keyword.getId() > 0) {
			return dao.update(keyword);
		}
		return OperationStatus.FAILURE;
	}

	public Keyword get(int id) {
		if (id > 0) {
			return dao.get(id);
		}
		return null;
	}
	
	public List<MonitorType> getMonitorNothingWithKeyword(int keywordId) {
		if(!(keywordId > 0)) {
			return null;
		}
		return dao.getMonitorNothingWithKeyword(keywordId);
	}

	public OperationStatus delAllRelationship(int id) {
		if(id > 0) {
			return dao.delAllRelationship(id);
		}
		return OperationStatus.ERORR;
	}
}
